package com.yakaten.service;

import java.util.Properties;

import javax.mail.Address;
import javax.mail.AuthenticationFailedException;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;

public class Mail {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		Properties props = System.getProperties();
//
//		// Get a Session object
//		Session session = Session.getInstance(props, null);
//		session.setDebug(true);
		new Mail().readAll();
	}

	public void readAll(){
//		String host = "imap.gmail.com";
//		int port = 993;
//		String user = "akira.tanagi@gmail.com";
//		String password = "andybest123";
//		String target_folder = "INBOX";
		
		String host = "imap.mail.rakuten.com";
		int port = 993;
		String user = "ts-ming.liu@mail.rakuten.com";
		String password = "Rakuten1234";
		String target_folder = "INBOX";

		Properties props = System.getProperties();
		
//		props.setProperty("socksProxyHost","proxysv");
//		props.setProperty("socksProxyPort","80");
//		props.setProperty("socksProxyUser","ts-ming.liu");
		
//		props.setProperty("http.proxyHost", "proxysv"); 
//		props.setProperty("http.proxyPort","80");
//		props.setProperty("http.proxyUser","ts-ming.liu");
		
//		props.setProperty("proxySet","true"); 
//		props.setProperty("ProxyHost","proxysv"); 
//		props.setProperty("ProxyPort","80"); 
//		props.setProperty("ProxyUser","ts-ming.liu");
		
//        props.setProperty("proxySet", "true");
//        props.setProperty("socksProxyHost", "proxysv");  
//        props.setProperty("socksProxyPort", "1089");
		
		Session sess = Session.getInstance(props, null);
		sess.setDebug(true);

		Store st;
		try {
			st = sess.getStore("imaps");
			st.connect(host, port, user, password);
			Folder fol = st.getFolder(target_folder);
			if(fol.exists()){
				for(Folder f : fol.list()){
					System.out.println(f.getName());
				}
				fol.open(Folder.READ_ONLY);
				for(Message m : fol.getMessages()){
					System.out.printf("%s - %d\n", m.getSubject(), m.getSize());
				}
				fol.close(false);
			}else{
				System.out.printf("%s is not exist.", target_folder);
			}
			st.close();
		} catch (NoSuchProviderException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		}

	}
	public void process() {
		final Properties props = new Properties();

		// 基本情報。ここでは gmailへの接続例を示します。
		props.setProperty("mail.pop3.host", "pop.gmail.com");
		props.setProperty("mail.pop3.port", "995");

		// タイムアウト設定
		props.setProperty("mail.pop3.connectiontimeout", "60000");
		props.setProperty("mail.pop3.timeout", "60000");

		// SSL関連設定
		props.setProperty("mail.pop3.socketFactory.class",
				"javax.net.ssl.SSLSocketFactory");
		props.setProperty("mail.pop3.socketFactory.fallback", "false");
		props.setProperty("mail.pop3.socketFactory.port", "995");

		final Session session = Session.getInstance(props, new Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication("akira.tanagi@gmail.com",
						"password");
			}
		
		});

		// デバッグを行います。標準出力にトレースが出ます。
		session.setDebug(true);

		Store store = null;
		try {
			try {
				store = session.getStore("pop3");
			} catch (NoSuchProviderException e) {
				System.out.println("メール受信: 指定プロバイダ[pop3]の取得に失敗しました。"
						+ e.toString());
				return;
			}

			try {
				store.connect();
			} catch (AuthenticationFailedException e) {
				System.out.println("メール受信: サーバ接続時に認証に失敗しました。" + e.toString());
				return;
			} catch (MessagingException e) {
				System.out.println("メール受信: サーバ接続に失敗しました。" + e.toString());
				return;
			}

			Folder folder = null;
			try {
				try {
					// INBOXは予約語です。
					folder = store.getFolder("INBOX");
				} catch (MessagingException e) {
					System.out.println("メール受信: INBOXフォルダ取得に失敗しました。"
							+ e.toString());
					return;
				}
				try {
					folder.open(Folder.READ_ONLY);
				} catch (MessagingException e) {
					System.out
							.println("メール受信: フォルダオープンに失敗しました。" + e.toString());
					return;
				}

				// メッセージ一覧を取得
				try {
					final Message messages[] = folder.getMessages();
					for (int index = 0; index < messages.length; index++) {
						final Message message = messages[index];

						// このAPI利用範囲であれば TOPコマンド止まりで、RETRコマンドは送出されない。

						System.out.println("Subject: " + message.getSubject());
						System.out.println("  Date: "
								+ message.getSentDate().toString());

						// TODO 0番目の配列アクセスをおこなっている点に注意。
						final InternetAddress addrFrom = (InternetAddress) message
								.getFrom()[0];
						System.out.println("  From: " + addrFrom.getAddress());
						// MimeUtility.decodeText(addrFrom.getPersonal())

						// To: を表示。
						final Address[] addrsTo = message
								.getRecipients(RecipientType.TO);
						for (int loop = 0; loop < addrsTo.length; loop++) {
							final InternetAddress addrTo = (InternetAddress) addrsTo[loop];
							System.out.println("  To: " + addrTo.getAddress());
						}

						// Cc:は割愛

						// なお、例えば message.getContentを呼び出すと RETRコマンドが送出される。
					}
				} catch (MessagingException e) {
					System.out.println("メール受信: メッセージ取得に失敗しました。" + e.toString());
					return;
				}
			} finally {
				if (folder != null) {
					try {
						folder.close(false);
					} catch (MessagingException e) {
						System.out.println("メール受信: フォルダクローズに失敗しました。"
								+ e.toString());
					}
				}
			}
		} finally {
			if (store != null) {
				try {
					store.close();
				} catch (MessagingException e) {
					System.out.println("メール受信: サーバ切断に失敗しました。" + e.toString());
				}
			}
		}
	}

}
